<?php 

class CategoryModel extends Model{
	//........设置分类模板属性............
	public $table = 'category';	
	
	
	
	//.........添加分类的验证............
	public $validate = array(
		//array('字段名','验证方法/验证类','错误信息','验证条件','验证时机')
		//判断用户名是否为空
		//2是必须验证
		//3是插入与更新的时候都要验证
		array('cname','nonull','分类名称不能为空',2,3),
		//array('字段的class名','最大长度如：maxlen:20','错误信息','必须验证','插入与更新')
		array('cname','maxlen:20','分类名称不能超过20个字符 ',2,3),
		
	);
	
	
	//............自动完成..........	
	public $auto = array(
		//方法  
		// 2.必须处理  
		// 3值不为空时
		array('catepic','_catepic','method',2,3)
		
	);
	
	//..........上传分类图片...............
	
		public function _catepic(){
			//执行上传
			$upload = new Upload();
			$file = $upload->upload();
			if($file){
				//执行缩略
				$img = new Image();
				$info = $img->thumb($file[0]['path']);
				return $info;
			}else{
				//...修改时....
				if($catepicH = Q('post.catepicH')) return $catepicH;
			}
		}
	
	
	
	
	
	//..................添加数据............................
	public function add_data(){
		//分类不能有同名
		//传输过来的canme 赋值给$canme
		$cname = Q('post.cname');
		//判断如果这个get_one_data获得一条数据中的canme 等于这个cname
		if($this->get_one_data(array('cname'=>$cname))){
			//那就把这个传输过来的名字 反出加上错误信息
			$this->error = $cname . '分类已经存在';
			//然后 反出错误
			return false;
		}
		//判断  如果为空 就返出 错误
		if(!$this->create()) return false;
		//然会反出这个添加类
		return $this->add();		
	}
	
	//...........获得所有数据................
	
	//给他来一个where为空的参数 外部调用可以不用where
	public function get_all_data($where=NULL){
		//获得csort数据  csort种类 类型   比如  新闻类   体育类
		//order 排序   ASC 从小到大     
		//all  全部获取  然后导入 $data
		// 在方法里传入一个where参数 为空   如果调用这个模板可以不用这where这个where
		$data = $this->order('sort ASC')->where($where)->all();
		//格式化树状的数据
		//数据处理类主要是对数组等数据进行处理，如无限级分类操作、商品规格的迪卡尔乘积运算等。
		//tree($数组, $字段名称, $主键 id = 'cid', $父集 id = 'pid')
		//Data::tree() 获得树状结构  然后导入 $data
//		$data = Data::tree($data,'cname','cid','pid');
		//然后反出$data
		return $data;
	}
	
	//...........获得一条数据..............
	//可以给这个方法 传参数  where  field  
	//不添加可以为空    field 不添就是默认为*
	public function get_one_data($where=NULL,$field=NULL){
		//通过 where 方法操作 SQL 条件，可以指定多种参数类型，非常自由。
		//找到一个这个数据里的一条信息 获取到 然后反出
		return $this->where($where)->field($field)->find();
	}
	
	//................获取所有的子集......................	
	//获取到他的CID
	public function get_son_data($cid){
		//调出所有的数据  然后压入$data   
		$data = $this->all();
		//然后把 $data 所有的cid  交给子集分类 让其递归获得有所压入数组
		return $this->get_son($data,$cid);
	}
	
	
	//..............递归获得所有的子集分类.....................
	public function get_son($data,$cid){
		//temp 临时       定义一个临时数组  
		$temp = array();
		//然后循环一下提交过来的所有数据 里的值
		foreach ($data as $v){
			//判断一下 循环出来的 值 的父集的pid == 父集$cid的话
			if($v['pid'] == $cid){
				//把循环出来的的值的cid 压入这个临时空数组
				$temp[] = $v['cid'];
				//array_merge 合并数组
				//把循环出来的父集pid 和自身cid 整合成一个新的数组 压入$temp
				$temp = array_merge($temp,$this->get_son($data,$v['cid']));
//		p($temp);
			}
		}
		//然后反出这个临时数组
		return $temp;
	}
	
	
	//.............删除分类...............	
	public function del_data($cid){
		//p($cid);
		//判断一下是否有子集
		$data = $this->where(array('pid'=>$cid))->find();
		//判断这个DATA 如果有子集分类 
		if($data){
			//反出错误信息
			$this->error = '请先删除该分类下面的子集';
			//如果反出的是false 就不执行下面的语句了
			return false;
		}
		//反之 如果没有反出的是false 就反出的是删除确认
		return $this->where(array('cid'=>$cid))->delete();
	}
	
	
	//..................获得可以更换选择的父级分类(排除自己和自己子集).....................	
	public function get_change_cate($cid){
		//获取子集分类的数据的cid
		$son = $this->get_son_data($cid);
		
		//把这个获取到的子集的cid压入新的数组中
		$son[] = $cid;
		//'SLEECT * FROM hd_category WHERE cid not in (8,11)'
		//$this->get_all_data获取到所有数据
		//获取所有数据里的 
		$data = $this->get_all_data('cid not in(' . implode(',', $son) .')');
	
//		p($data);
		//反出这个数据
		return $data;	
	}
	
	//...............修改数据......................
	//给他默认值传一个where为空的参数   外部可以不添 默认为空
	public function update_data($where=NULL){		
		//save 别名update
		//a. 自动过滤掉非法字段
		//b. 自动进行数据安全处理
		//c. 默认以 $_POST 数据更新
		//d. 必须有更新条件 , 防止误更新
		//e. 如果参数中存在主键值将以这个值为条件进行更新数据
	 $this->where($where)->save();
		// getLastSql 获得最后一条SQL
//		p($this->getLastSql());die;
	}
	
	
		
	
	
}
